
package com.eva.android.widget;

import com.eva.android.AppManager;
import com.eva.android.ToolKits;
import com.eva.android.x.XToolKits;
import com.x52im.rbchat.IMClientManager;
import com.x52im.rbchat.MyApplication;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.main.SplashActivity;
import com.x52im.rbchat.utils.IntentFactory;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

/**
 * 应用程序Activity的基类
 *
 * @author liux (http://my.oschina.net/liux)
 * @version 1.0
 */
public class BaseActivity extends AppCompatActivity//Activity
{
    private final static String TAG = BaseActivity.class.getSimpleName();

    // 是否允许销毁
    private boolean allowDestroy = true;

    private View view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 添加Activity到堆栈
        AppManager.getAppManager().addActivity(this);

        //----------------------------- APP 异常自救代码 START
        if (this.appHearthCheckInvalid())
            return;
        //----------------------------- APP 异常自救代码 END

        // 设置状态栏文字颜色为深色（系统默认是白色）
        configStatusBarTextColorDark();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        // 结束Activity&从堆栈中移除
        AppManager.getAppManager().removeActivity(this);
    }

    public void setAllowDestroy(boolean allowDestroy) {
        this.allowDestroy = allowDestroy;
    }

    public void setAllowDestroy(boolean allowDestroy, View view) {
        this.allowDestroy = allowDestroy;
        this.view = view;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && view != null) {
            view.onKeyDown(keyCode, event);
            if (!allowDestroy) {
                return false;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    public Activity self() {
        return this;
    }

    /**
     * 一个方便的 getResources().getString(id) 方法封装。
     *
     * @param id
     * @return
     * @see #getResources()
     * @see #getString(int)
     */
    public String $$(int id) {
        return this.getResources().getString(id);
    }

    /**
     * 资源字符串国际化。
     *
     * @param messageFormatPatternResId 资源字符串，字符串内容通常形如："视频会话发送失败 t0 {0}({1},{2})"
     * @param arguments                 对应于messageFormatPatternResId中的占位符
     * @return 返回格式化后的字符串
     */
    public String i18n(int messageFormatPatternResId, Object... arguments) {
        return ToolKits.i18n(this, messageFormatPatternResId, arguments);
    }

    /**
     * 一个方便简短的获取本地用户信息的方法。
     *
     * @return 如果读取成功则返回本地用户信息对象，否则返回null
     */
    protected RosterElementEntity lu() {
        try {
            return MyApplication.getInstance2().getIMClientManager().getLocalUserInfo();
        } catch (Exception e) {
            Log.w(TAG, e);
        }
        return null;
    }

	/**
	 * 一个方便简短的获取IMClientManager全局对象引用的方法。
	 *
	 * @return 如果读取成功则返回对象，否则返回null
	 */
	protected IMClientManager imc(){
		return MyApplication.getInstance2().getIMClientManager();
	}

    /**
     * 设置状态栏文字颜色为深色（系统默认是白色）。
     * <p>
     * 说明：之所以要设置为深色，是因为RainbowChat的绝大多数界面，沉浸式效果时的背景用的是白色，
     * 系统默认的状态栏文字颜色也是白色，这样的话就看不清系统的时间等等内容了，太难看。
     */
    protected void configStatusBarTextColorDark() {
        XToolKits.setStatusBarTextColorDark(this);
    }

    //----------------------------- APP 异常自救代码 START

    /**
     * 关于APP异常自救的原因、方案、实现逻辑等，请见 {@link MyApplication#appHearthCheckFlag} 字段的详细说明。
     *
     * @return true表示APP现场处于非正常状态，否则表示正常状态
     */
    private boolean appHearthCheckInvalid() {
        try {
            Class clazz = SplashActivity.class; // 入口activity

            String className = getClass().getSimpleName();

            // 如果当前类非闪屏类，才需要进行异常判断，否则不需要
            if (!getClass().equals(clazz)) {
                Log.d(TAG, "【APP异常现场检查-内】当前" + className + "不是入口类，且MyApplication.appHearthCheckFlag="
                        + MyApplication.appHearthCheckFlag);

                // 处于异常现场了
                if (MyApplication.appHearthCheckFlag == -1) {
                    Log.w(TAG, "【APP异常现场检查-内】已在" + className + "中检测到APP异常现场，马上进" +
                            "入异常重启逻辑（即跳转到PortalActivity主界面【第1/2步】）。。。");

                    Context ctx = MyApplication.getInstance2();

                    // 以下逻辑为跳转到PortalActivity主界面
                    Intent i = IntentFactory.createPortalIntent(ctx);
                    // 没有这个flag，是无法借助Application实例启动activity的
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    // 前往门户主页
                    ctx.startActivity(i);

                    return true;
                } else {
                    Log.d(TAG, "【APP异常现场检查-内】在" + className + "中未检测到APP异常现场，什么也不需要做！（MyApplication.appHearthCheckFlag="
                            + MyApplication.appHearthCheckFlag + "）");
                }
            } else {
                Log.d(TAG, "【APP异常现场检查-内】当前" + className + "是入口类自已，什么也不需要做！（MyApplication.appHearthCheckFlag="
                        + MyApplication.appHearthCheckFlag + "）");
            }
        } catch (Exception e) {
            Log.w(TAG, e);
        }

        return false;
    }
    //----------------------------- APP 异常自救代码 END
}
